package com.guchenbo.example.string;

/**
 * Created by CreGu on 2016/6/12.
 */
public class TestString2 {
    public static void main(String[] args) {
        String s = "abc";
        // 常量折叠，编译器优化，等同于 "abc"
        String s1 = "a" + "bc";
        // true
        System.out.println(s == s1);

        final String ss1 = "a";
        final String ss2 = "bc";
        // 常量折叠，编译器优化，等同于 "abc"
        String s2 = ss1 + ss2;
        // true
        System.out.println(s == s2);

        String ss3 = "a";
        String ss4 = "bc";
        // 两个对象+操作，等同于 new StringBuffer().append(ss3).append(ss4).toString()，是一个新对象
        String s3 = ss3 + ss4;
        // false
        System.out.println(s == s3);
        // false s3.intern() 返回的是 s
        System.out.println(s3.intern() == s3);
        // true
        System.out.println(s3.intern() == s);
        // true
        System.out.println(s3.intern() == s2);

        String s4 = new String("1") + new String("2");
        // s4 的值是12，字符串常量池不存在，intern 之后把s4的对象放入常量池
        s4.intern();
        // 常量池包含12，s5和s4指向同一个地址
        String s5 = "12";
        // true
        System.out.println(s4 == s5);

        String s6 = new String("1") + new String("3");
        // 常量池不包含13，在常量池增加13对象
        String s7 = "13";
        // s6 的值是13，字符串常量池已经存在13，intern 直接返回13的对象地址
        s6.intern();
        // false
        System.out.println(s6 == s7);

    }
}
